import numpy as np
import operator
import matplotlib.pyplot as plt

#分类器
def classify0(inX,dataSet, labels,k):
    """
    knn算法分类器.
    参数:
        inX: 待分类样本(列表或一维数组)
        dataSet: 训练数据(二维数组或矩阵)
    返回:
        待分类样本的标签
    """
    #使用numpy的广播机制，计算inX与dataSet的每个训练集样本的欧氏距离
    diffMat=dataSet-inX
    sqDiffMat = diffMat**2
    sqDistances =np.sum(sqDiffMat,axis=1)
    # 将待分类样本与训练集每个样本的距离存储在列表中
    distances = sqDistances**0.5

    # 返回升序距离列表元素的索引
    sortedDistIndicies = distances.argsort()

    # 取出待分类样本与训练集距离最近的k个(3),并统计3个最近距离的标签出现次数
    classCount={}
    for i in range(3):
        voteIlabel = labels[sortedDistIndicies[i]]
        classCount[voteIlabel]=classCount.get(voteIlabel,0)+1

    # 对字典数据排序,这里是根据‘值’进行的排序，而且是降序
    sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True)
    # 返回k个距离中,某个出现最多的标签
    return sortedClassCount[0][0]

# 归一化处理
def autoNorm(dataSet):
    """
    对多特征数据进行归一化处理
    参数:
        dataSet: 多特征数据集(二维数组)
    返回值:
        normMat: 归一化后的多特征数据集
        ranges: 每个特征数据的波动范围
        minVals: 每个特征数据的最小值
    """
    minVals = np.min(dataSet,axis=0)
    maxVals = np.max(dataSet,axis=0)
    ranges = maxVals-minVals
    normMat = (dataSet-minVals)/ranges
    return normMat,ranges,minVals